# 企业员工管理系统
import os

from employee import Employee


class EmployeeManagerSystem(object):

    def __init__(self):
        # 存放员工数据的文件
        self.employee_data_file = 'employee_data.txt'

        # 备份员工数据的文件（上传保存前的员工备份文件，只备份一份）
        self.employee_data_file_backup = 'employee_data_backup.txt'

        # 从文件中加载之后的员工列表
        self.employee_list = []

        # True表示已保存员工数据
        self.save_flag = True

    # 行为
    # a.加载和读取员工数据文件
    # b.显示系统欢迎界面
    # c.添加员工
    # d.删除员工
    # e.修改员工信息
    # f.查询员工信息
    # g.显示所有员工
    # h.保存员工信息到文件中
    # i.退出系统项目
    # j.程序入口函数

    def main(self):
        """
        员工管理系统的入口
        :return:
        """
        # 1. 加载和读取员工数据文件
        self.load_employee()

        while True:
            # 2. 显示系统欢迎界面
            self.show_hello()

            # 3. 由用户输入指定的功能数字
            menu_number = int(input('请输入你需要的功能编号: '))

            if menu_number == 7:
                # 退出系统前报错员工信息到文件中
                self.go_out()
                break
            elif menu_number == 1:
                # 添加员工信息
                self.add_employee()
            elif menu_number == 2:
                # 删除员工信息
                self.del_employee()
            elif menu_number == 3:
                # 修改员工信息
                self.update_employee()
            elif menu_number == 4:
                # 查找员工信息
                self.search_employee()
            elif menu_number == 5:
                # 打印所有员工信息
                self.show_all_employee()
            elif menu_number == 6:
                # 保存员工信息到文件
                self.save_employee()

    def load_employee(self):
        """
        读取员工数据文件，把所有的员工信息都放到一个列表中
        :return:
        """
        try:
            f = open(self.employee_data_file, 'r', encoding='utf-8')
        except Exception as err:
            # 如果报错，可能是第一次启动程序，这个文件还没有创建出来，需要进行创建
            f = open(self.employee_data_file, 'w', encoding='utf-8')
        else:
            # 没有报错，意味着文件存在，那就从文件中读取数据
            # read()函数默认读取整个文件内容，也可以传入参数读取指定字节的数据
            data = f.read()
            if data:  # 必须保证文件中有数据
                # eval()函数是实现将字符串转化为 list、dict、tuple
                lst = eval(data)
                for dict1 in lst:
                    self.employee_list.append(Employee(dict1['name'], dict1['gender'], dict1['age'],
                                                       dict1['mobile_number'], dict1['is_leave']))

        finally:
            if f:  # 如果文件存在就关闭
                f.close()

    @staticmethod
    def show_hello():
        """
        显示系统的欢迎界面
        因为当前函数中并未调用self，所以可以设置成静态函数
        （静态函数可以通过self调用，也可以直接调用）
        :return:
        """
        print('欢迎进入企业员工管理系统')
        print('-' * 60)
        print('1: 添加员工')
        print('2: 删除员工')
        print('3: 修改员工')
        print('4: 查找员工')
        print('5: 展示所有员工')
        print('6: 保存员工数据')
        print('7: 退出系统')
        print('-' * 60)

    def add_employee(self):
        """
        添加员工信息
        :return:
        """
        # 1. 由用户输入需要添加的员工信息
        name = input('请输入员工姓名: ')
        gender = input('请输入员工性别: ')
        age = input('请输入员工年龄: ')
        mobile_number = input('请输入员工电话号码: ')
        is_leave = input('请输入员工是否离职(1表示离职，0表示在职): ')

        # 2. 创建一个员工对象
        emp = Employee(name, gender, age, mobile_number, is_leave)

        # 表示完成一次员工信息添加，但此时还没有写入文件中
        self.save_flag = False

        # 3. 将新加入的员工添加到列表中

        self.employee_list.append(emp)

        # 4. 把添加的员工信息，输出展示
        print(emp)

    def del_employee(self):
        """
        删除员工信息
        :return:
        """
        # 1. 输入被删除的员工姓名
        del_name = input('请输入要删除的员工姓名: ')

        # 2. 遍历员工列表，判断员工是否存在
        for emp in self.employee_list:
            if emp.name == del_name:
                # 表示完成一次员工信息删除，但此时还没有写入文件中
                self.save_flag = False
                self.employee_list.remove(emp)
                print(f'该员工{del_name}已经删除成功')
                break
        else:
            # 遍历员工列表，没有找到对应员工姓名
            print(f'没有找到名字叫{del_name}的员工')

    def update_employee(self):
        """
        修改员工信息
        :return:
        """
        # 1. 输入被修改的员工姓名
        update_name = input('请输入要修改的员工姓名: ')

        # 2. 遍历员工列表，判断员工是否存在
        for emp in self.employee_list:
            if emp.name == update_name:
                # 表示完成一次员工信息修改，但此时还没有写入文件中
                self.save_flag = False
                # 3. 修改员工的其他属性
                new_name = input('请输入新的姓名(不修改直接回车): ').strip()
                emp.name = new_name if new_name else emp.name

                new_sex = input('请输入新的性别(不修改直接回车): ').strip()
                emp.gender = new_sex if new_sex else emp.gender

                new_age = input('请输入新的年龄(不修改直接回车): ').strip()
                emp.age = int(new_age) if new_age else emp.age

                new_number = input('请输入新的手机号码(不修改直接回车): ').strip()
                emp.mobile_number = new_number if new_number else emp.mobile_number

                new_leave = input('请输入是否离职，1表示离职，0表示在职(不修改直接回车): ').strip()
                if new_leave:
                    emp.is_leave = True if int(new_leave) == 1 else False

                print('员工信息修改完成: ')
                print(emp)
                break
        else:
            # 遍历员工列表，没有找到对应员工姓名
            print(f'没有找到名字叫{update_name}的员工')

    def search_employee(self):
        """
        根据姓名，查找员工信息
        :return:
        """
        # 1. 输入查询的员工姓名
        search_name = input('请输入要查询的员工姓名: ')

        # 2. 遍历员工列表，判断员工是否存在
        for emp in self.employee_list:
            if emp.name == search_name:
                print(emp)
                break
        else:
            # 遍历员工列表，没有找到对应员工姓名
            print(f'没有找到名字叫{search_name}的员工')

    def show_all_employee(self):
        """
        打印所有员工信息
        :return:
        """
        print('姓名\t年龄\t性别\t手机号码\t是否离职')
        for emp in self.employee_list:
            print(emp)

    def save_employee(self):
        """
        保存员工信息到文件
        1. 先把原来的数据文件备份(如果已经存在备份文件，就将原备份文件删除)
        2. 创建新文件
        3. 写入数据
        4. 关闭文件流
        :return:
        """
        # 在指定路径找该备份文件是否存在，若存在就删除备份文件
        if os.path.exists(self.employee_data_file_backup):
            os.remove(self.employee_data_file_backup)
        # 1. 备份（实际上就是修改文件名）
        os.rename(self.employee_data_file, self.employee_data_file_backup)
        # 2. 打开文件
        with open(self.employee_data_file, 'w', encoding='utf-8') as f:
            # 3. 写入数据
            new_list = []
            for emp in self.employee_list:
                # 原来的列表中是一个个的emp对象
                new_list.append(emp.__dict__)
            # new_list：[{'name': 'zs', ...},{},{}]
            f.write(str(new_list))

        # 表示员工信息已保存到文件中，此时修改保存文件的状态
        self.save_flag = True

    def go_out(self):
        """
        退出系统前，需要保存员工信息到文件中
        :return:
        """
        # 员工数据没有保存时
        if not self.save_flag:
            self.save_employee()
        print('谢谢! 程序退出')


if __name__ == '__main__':
    ems = EmployeeManagerSystem()
    ems.main()
